package cc.location.app;

import android.text.TextUtils;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationQualityReport;

import java.text.SimpleDateFormat;
import java.util.Locale;

/**
 * 类作用描述
 */
public class LocationUtils {
    /**
     * int 获取定位结果来源
     * 0 定位失败 请通过AMapLocation.getErrorCode()方法获取错误码，并参考错误码对照表进行问题排查。
     * 1 GPS定位结果 通过设备GPS定位模块返回的定位结果，精度较高，在10米－100米左右
     * 2 前次定位结果 网络定位请求低于1秒、或两次定位之间设备位置变化非常小时返回，设备位移通过传感器感知。
     * 4 缓存定位结果 返回一段时间前设备在同样的位置缓存下来的网络定位结果
     * 5 Wifi定位结果 属于网络定位，定位精度相对基站定位会更好，定位精度较高，在5米－200米之间。
     * 6 基站定位结果 纯粹依赖移动、联通、电信等移动网络定位，定位精度在500米-5000米之间。
     * 8 离线定位结果
     * 9 最后位置缓存
     */
    public static String getLocationLog(AMapLocation location) {
        StringBuffer sb = new StringBuffer();
        //errCode等于0代表定位成功，其他的为定位失败，具体的可以参照官网定位错误码说明
        if (location.getErrorCode() == 0) {
            sb.append("定位成功" + "\n");
            sb.append("定位类型：").append(location.getLocationType()).append("\n");
            sb.append("经    度：").append(location.getLongitude()).append("\n");
            sb.append("纬    度：").append(location.getLatitude()).append("\n");
            sb.append("精    度：").append(location.getAccuracy()).append("米").append("\n");
            sb.append("提 供 者：").append(location.getProvider()).append("\n");
            sb.append("速    度：").append(location.getSpeed()).append("米/秒").append("\n");
            sb.append("角    度：").append(location.getBearing()).append("\n");
            // 当前提供定位服务卫星数
            sb.append("星    数：").append(location.getSatellites()).append("\n");
            sb.append("国    家：").append(location.getCountry()).append("\n");
            sb.append("省：").append(location.getProvince()).append("\n");
            sb.append("市：").append(location.getCity()).append("\n");
            sb.append("城市编码：").append(location.getCityCode()).append("\n");
            sb.append("区：").append(location.getDistrict()).append("\n");
            sb.append("区 域 码：").append(location.getAdCode()).append("\n");
            sb.append("地    址：").append(location.getAddress()).append("\n");
            sb.append("兴 趣 点：").append(location.getPoiName()).append("\n");
            // 定位完成时间
            sb.append("定位时间：").append(formatUtc(location.getTime(), "yyyy-MM-dd HH:mm:ss")).append("\n");
        } else {
            //定位失败
            sb.append("定位失败" + "\n");
            sb.append("错误码:" + location.getErrorCode() + "\n");
            sb.append("错误信息:" + location.getErrorInfo() + "\n");
            sb.append("错误描述:" + location.getLocationDetail() + "\n");
        }
        // 定位后回调时间
        sb.append("回调时间: ").append(formatUtc(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")).append("\n");
        sb.append("***定位质量报告***").append("\n");
        sb.append("* WIFI开关：").append(location.getLocationQualityReport().isWifiAble() ? "开启" : "关闭").append("\n");
        sb.append("* GPS状态：").append(getGPSStatusString(location.getLocationQualityReport().getGPSStatus())).append("\n");
        int numberOfSatellites = location.getLocationQualityReport().getGPSSatellites();
        sb.append("* GPS星数：").append(numberOfSatellites).append("\n");
        sb.append("****************").append("\n");
        return sb.toString();
    }

    /**
     * 获取GPS状态的字符串
     *
     * @param statusCode GPS状态码
     * @return
     */
    public static String getGPSStatusString(int statusCode) {
        String str = "";
        switch (statusCode) {
            case AMapLocationQualityReport.GPS_STATUS_OK:
                str = "GPS状态正常";
                break;
            case AMapLocationQualityReport.GPS_STATUS_NOGPSPROVIDER:
                str = "手机中没有GPS Provider，无法进行GPS定位";
                break;
            case AMapLocationQualityReport.GPS_STATUS_OFF:
                str = "GPS关闭，建议开启GPS，提高定位质量";
                break;
            case AMapLocationQualityReport.GPS_STATUS_MODE_SAVING:
                str = "选择的定位模式中不包含GPS定位，建议选择包含GPS定位的模式，提高定位质量";
                break;
            case AMapLocationQualityReport.GPS_STATUS_NOGPSPERMISSION:
                str = "没有GPS定位权限，建议开启gps定位权限";
                break;
        }
        return str;
    }

    /**
     * 判断两点是否是同一点
     *
     * @return
     */
//    public static boolean isSameLocation(LatLng latLng1,LatLng latLng2){
//        if (latLng1.equals(latLng2)){
//            return true;
//        } else {
//            return (latLng1.latitude == latLng2.latitude) && (latLng1.longitude == latLng2.longitude);
//        }
//    }


    private static SimpleDateFormat simpleDateFormat = null;

    /**
     * 格式化UTC
     *
     * @param l          long
     * @param strPattern String
     * @return String
     */
    public static String formatUtc(long l, String strPattern) {
        if (TextUtils.isEmpty(strPattern)) {
            strPattern = "yyyy-MM-dd HH:mm:ss";
        }
        if (simpleDateFormat == null) {
            try {
                simpleDateFormat = new SimpleDateFormat(strPattern, Locale.CHINA);
            } catch (Throwable e) {
                Log.e("shitou", e.getMessage());
            }
        } else {
            simpleDateFormat.applyPattern(strPattern);
        }
        return simpleDateFormat == null ? "null" : simpleDateFormat.format(l);
    }
}